package br.gov.dataprev.treinamento.ejb.modelo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import br.gov.dataprev.treinamento.ejb.modelo.Categoria;
import br.gov.dataprev.treinamento.ejb.modelo.Cliente;
import br.gov.dataprev.treinamento.ejb.modelo.Endereco;
import br.gov.dataprev.treinamento.ejb.modelo.ItemPedido;
import br.gov.dataprev.treinamento.ejb.modelo.ItemPedidoPK;
import br.gov.dataprev.treinamento.ejb.modelo.Pedido;
import br.gov.dataprev.treinamento.ejb.modelo.PessoaFisica;
import br.gov.dataprev.treinamento.ejb.modelo.Produto;
import br.gov.dataprev.treinamento.ejb.modelo.Sexo;
import br.gov.dataprev.treinamento.ejb.modelo.SituacaoPedido;
import br.gov.dataprev.treinamento.ejb.modelo.Telefone;

public class Carga {
	
	private static EntityManager em;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("loja");
		em = factory.createEntityManager();
		
	}
	
	
	String[] nomes = new String[] {"Rita Fernandes","Maria Macedo","Joao Maciel","Manuel Oliveira", "Leonardo Simoes", "Pedro de Lara"};
	String[] cpfs = new String[]{"04291382709", "24261367708", "2236261708", "2881465508", "34361337405", "23262327138"};
	String[] emails = new String[]{"rita.fernandes@dataprev.gov.br", "maria.macedo@dataprev.gov.br", "joao.maciel@dataprev.gov.br", "manuel.oliveira@dataprev.gov.br", "leo.simoes@dataprev.gov.br", "pedro.lara@dataprev.gov.br"};
	Sexo[] sexos = new Sexo[]{Sexo.FEMININO,Sexo.FEMININO,Sexo.MASCULINO,Sexo.MASCULINO,Sexo.MASCULINO,Sexo.MASCULINO};
	Integer[] tel = new Integer[]{83450090, 64420090, 24650790, 73470070, 84430290, 93353394, 73463390, 63345090, 34455690, 74422470, 85567290, 83324504};
	String[] logradouro = new String[] {"Rua Jose Paulino", "Av. Brasil", "Rua Aroazes", "Rua NY", "Rua Bora", "Av. Pres Vargas"};
	
	
	
	
	@Test
	public void inserirCliente() {		
		int numero = 31;
		int cep = 22400830;
		
		for (int i = 0; i < 6; i++) {
			PessoaFisica pf = new PessoaFisica();
			pf.setDataCadastro(new Date());
			pf.setNome(nomes[i]);
			pf.setCpf(cpfs[i]);
			pf.setEmail(emails[i]);
			pf.setSexo(sexos[i]);
			List<Telefone> telefones = new ArrayList<Telefone>();
			for (int j = 0; j < 2; j++) {	
				Telefone t = new Telefone();				
				t.setDdd((short) 21);
				t.setTelefone(tel[i*2+j]);
				t.setCliente(pf);
				telefones.add(t);
				
			}
			pf.setTelefones(telefones);
			
			Endereco e = new Endereco();
			e.setLogradouro(logradouro[i]);
			e.setNumero((numero++)+"");
			e.setBairro("Divino");
			e.setCep((cep++)+"");
			e.setCidade("Rio de Janeiro");
			e.setUf("RJ");			
			pf.setEndereco(e);
			
			em.getTransaction().begin();
		    em.persist(pf);
		    em.flush();
//		    for (Telefone telefone : telefones) {
//				em.persist(telefone);
//			}
		    em.getTransaction().commit();
		}
		
	}
	
	
	String[] produtos = new String[] {"Xbox","CD","DVD","PlayStation 3", "VHS", "PENDRIVE"};
	String[] descricao = new String[] {"Xbox","CD 32x RW","Sonic DVD","Aparelho Sony BlueRay", "Fita de VHS", "Smart PENDRIVE"};
	Boolean[] b = new Boolean[] {Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.FALSE, Boolean.TRUE};
	String[] fornecedor = new String[] {"Erika","SAMSUNG","LG","SONY","PIRATIUM","XLIVE"};
	BigDecimal[] vp = new BigDecimal[]{new BigDecimal(100.00), null,new BigDecimal(5.00), null, null, new BigDecimal(48.60) };
	BigDecimal[] vu = new BigDecimal[]{new BigDecimal(100.00), new BigDecimal(2.00),new BigDecimal(5.00), new BigDecimal(15.00), new BigDecimal(1.00), new BigDecimal(48.60) };
	
	@Test
	public void inserirCategorias() {
		em.getTransaction().begin();
		
		Categoria ce = new Categoria();
		ce.setDescricao("Eletronico");
		em.persist(ce);
		Categoria cma = new Categoria();
		cma.setDescricao("Media de Armazenamento");
		em.persist(cma);
		Categoria cb = new Categoria();
		cb.setDescricao("BlueRay");
		em.persist(cb);
		em.getTransaction().commit();
	}
	
	@Test
	public void inserirProduto() {
		
		@SuppressWarnings("unchecked")
		List<Categoria> cats = em.createQuery("select c from Categoria c").getResultList();

		
		for (int i = 0; i < 6; i++) {
			Produto p = new Produto();
			p.setNome(produtos[i]);
			p.setDescricao(descricao[i]);
			p.setDestaque(b[i]);
			p.setFornecedor(fornecedor[i]);
			p.setValorPromocao(BigDecimal.valueOf(rand(0, 50)));
			p.setValorUnitario(vu[i]);
			//p.setCategoria(new ArrayList<Categoria>());
			HashSet<Categoria> scats = new HashSet<Categoria>();
			
			int qcats = rand(1, cats.size());
			
			while (scats.size() < qcats ) {
				scats.add(cats.get(rand(0, cats.size()-1)));
			}
			
			p.setCategoria(new ArrayList<Categoria>(scats));
			
			em.getTransaction().begin();
		    em.persist(p);
		    em.flush();
		    em.getTransaction().commit();
		}
	}
	
	@Test
	public void inserirPedido() {		
		for(int i = 0; i < 2; i++) {
			
			em.getTransaction().begin();
		
		    Cliente cli = em.find(Cliente.class, Long.valueOf(rand(1, 6)));
		    
		    int quantProd = rand(1, 6);
		    
		    Set<Integer> idsProd = new HashSet<Integer>(quantProd);
		    while (idsProd.size() < quantProd) {
		    	idsProd.add(rand(1,6));
		    }
		    
		    Pedido pedido = new Pedido();
		    pedido.setCliente(cli);
		    pedido.setDataCadastro(randDate());
		    
		    do {
		    	pedido.setSituacao(SituacaoPedido.valueOf(rand(1,9)));
		    } while (pedido.getSituacao()==null);
		    
		    //em.persist(pedido);
		    //em.flush();
		    
		    ArrayList<ItemPedido> itens = new ArrayList<ItemPedido>();
		    
		    pedido.setItens(itens);
		    
		    
		    for (Integer idProd : idsProd) {
		    	ItemPedido item = new ItemPedido();
		    	item.setPedido(pedido);
		    	
				Produto produto = em.find(Produto.class, Long.valueOf(idProd));
				item.setProduto(produto);
				item.setQuantidade(rand(1,4));
				
				//ItemPedidoPK pk = new ItemPedidoPK(pedido.getId(), produto.getId());
				
				//item.setPk(pk);
				
				itens.add(item);
				
				
			}
		    em.persist(pedido);
			em.flush();
		    
		    em.getTransaction().commit();
		    
	    
		}
		
	}
	
	public static void main(String[] args) {
		
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("loja");
		EntityManager em = factory.createEntityManager();
		
		Cliente c = em.find(Cliente.class, 1L);
		
		em.getTransaction().begin();
		Pedido p = new Pedido();
		p.setCliente(c);
		p.setSituacao(SituacaoPedido.AGUARDANDO_CONFIRMACAO_PGTO);
		p.setDataCadastro(new Date());
		p.setItens(new ArrayList<ItemPedido>());
		
		//necess�rio persistir antes para recuperar o Id
		//em.persist(p);
		//em.flush();
		
		ItemPedido item = new ItemPedido();
		item.setPedido(p);
		Produto produto = em.find(Produto.class, 1L);
		item.setProduto(produto);
		ItemPedidoPK itemPK = new ItemPedidoPK(p.getId(), produto.getId());
		item.setPk(itemPK);
		
		//persiste novamente para gravar os itens
		em.persist(p);
		
	}
	
	@Test
	public void pedidoTest() {
		Pedido pedido = em.find(Pedido.class, 900L);
		System.out.println(pedido);
	}
	
		
	private static int rand(int ini, int fim) {
		return ini+(int)( (fim-ini+1)*Math.random() );
	}
	
	public static Date randDate() {

        int year = rand(2011, 2012);

        int month = rand(0, 11);

        GregorianCalendar gc = new GregorianCalendar(year, month, 1);

        int day = rand(1, gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));

        gc.set(year, month, day);
        
        return gc.getTime();


    }

	

}
